import java.util.ArrayList;
import java.util.Scanner;

public class MainInterface {
    public static void main(String[] args) {

        // 存储用户信息
        ArrayList<User> userList = new ArrayList<>();
        // 存储学生信息
        ArrayList<Student> studentList = new ArrayList<>();

        // 登录界面
        while (true) {
            System.out.println("---------学生信息管理系统登录界面----------");

            // 界面功能
            System.out.println("登录----------1");
            System.out.println("注册----------2");
            System.out.println("找回----------3");
            System.out.println("关闭----------4");

            // 获取用户输入
            System.out.println("请输入需要的功能后的数字：");
            Scanner sc = new Scanner(System.in);
            String choice = sc.next();

            // 功能入口
            switch (choice) {
                case "1" -> signIn(userList, studentList);
                case "2" -> logon(userList);
                case "3" -> System.out.println(retrieve(userList));
                case "4" -> System.exit(0);
                default -> System.out.println("没有此功能!");
            }
        }
    }

    // 登录模块
    public static void signIn(ArrayList<User> userList, ArrayList<Student> studentList) {
        // 输入用户名判断是否符合格式
        String userName = guideUserNameLong();
        boolean inputComposition = guideUserNameComposition(userName);

        // 用户密码输入判断
        String password = guideUserPasswordComposition();
        // 判断是否能进入操作界面
        boolean flog = inputComposition && userName.equals(userList.get(0).getUserName()) && password.equals(userList.get(0).getPassword());
        if (flog) {
            operatioonInterface(studentList);
        } else {
            System.out.println("登录失败");
        }
    }

    // 注册模块
    public static void logon(ArrayList<User> userArrayList) {

        // 创建用户对象
        User user = new User();

        // 用户名输入
        // 用户名唯一
        if (userArrayList.size() == 0) {
            // 1.没有用户名
            String userName;
            while (true) {
                // 用户名长度限制
                userName = guideUserNameLong();
                // 用户名组成限制
                if (guideUserNameComposition(userName)) {
                    break;
                }
                System.out.println("用户名包含非法成分");
            }
            user.setUserName(userName);
        } else {
            // 2.有用户名
            while (true) {
                System.out.println("请输入用户名：");
                Scanner scName = new Scanner(System.in);
                String userName = scName.next();
                int a = 0;
                for (int i = 0; i < userArrayList.size(); i++) {
                    // 用户名重复
                    if (userName.equals(userArrayList.get(i).getUserName())) {
                        break;
                    }
                    a ++;
                }
                if (a == userArrayList.size()) {
                    user.setUserName(userName);
                    break;
                }
                System.out.println("用户名已经存在");
            }
        }

        // 用户密码输入
        // 密码组成限制
        String password = guideUserPasswordComposition();
        // 再次输入密码
        while (true) {
            System.out.println("请再一次输入密码");
            Scanner scPasswordAgain = new Scanner(System.in);
            String passwordAgain = scPasswordAgain.next();
            if (password.equals(passwordAgain)) {
                break;
            }
            System.out.println("第二次密码输入错误，请再一次输入");
        }

        // 用户身份证号码输入
        // 用户身份证号码验证
        String IdOn = guideUserIdOnComposition();

        // 用户手机号码输入
        // 用户手机号码验证
        String phoneNumber = guidePhoneNumberComposition();

        // 添加成员变量给用户对象
        user.setPassword(password);
        user.setId_No(IdOn);
        user.setPhoneNumber(phoneNumber);
        userArrayList.add(user);
    }

    // 找回模块
    public static String retrieve(ArrayList<User> userList) {
        // 判断是否已经注册过
        if (userList.size() == 0) {
            return "你还未注册过，请进行注册";
        }

        // 判断用户名输入格式是否正确
        String userName;
        while (true) {
            // 用户名长度限制
            userName = guideUserNameLong();
            // 用户名组成限制
            if (guideUserNameComposition(userName)) {
                break;
            }
            System.out.println("用户名包含非法成分");
        }

        // 判断用户身份证输入格式
        String IdOn = guideUserIdOnComposition();

        // 判断用户手机号码输入格式
        String phoneNumber = guidePhoneNumberComposition();

        // 在集合查找信息
        if (userList.contains(userName) && userList.contains(IdOn) && userList.contains(phoneNumber)) {
            return userList.get(0).getPassword();
        } else {
            return "未找到相关信息";
        }

    }

    // 判断用户名长度
    public static String guideUserNameLong() {
        String userName;
        while (true) {
            System.out.println("请输入用户名：（长度在4～15之间，由字母或数字组成）");
            Scanner scName = new Scanner(System.in);
            userName = scName.next();
            if (4 <= userName.length() && userName.length() <= 15) {
                return userName;
            }
            System.out.println("用户名长度不符合要求");
        }
    }

    // 判断用户名组成
    public static boolean guideUserNameComposition(String userName) {

        int number = 0;
        for (int i = 0; i < userName.length(); i++) {
            if (('0' <= userName.charAt(i) && userName.charAt(i) <= '9') || ('a' <= userName.charAt(i) && userName.charAt(i) <= 'z') || ('A' <= userName.charAt(i) && userName.charAt(i) <= 'Z')) {
                number++;
            }
        }
        // 判断是否符合
        return number == userName.length();
    }

    // 判断用户密码组成
    public static String guideUserPasswordComposition() {
        String password;
        while (true) {
            System.out.println("请输入密码：（包含大小写字母和数字）");
            Scanner scPassword = new Scanner(System.in);
            password = scPassword.next();
            int numberAll = 0;
            int numberFigure = 0;
            for (int i = 0; i < password.length(); i++) {
                if (('0' <= password.charAt(i) && password.charAt(i) <= '9') || ('a' <= password.charAt(i) && password.charAt(i) <= 'z') || ('A' <= password.charAt(i) && password.charAt(i) <= 'Z')) {
                    numberAll++;
                }
                if ('0' <= password.charAt(i) && password.charAt(i) <= '9') {
                    numberFigure++;
                }
            }
            if (numberAll == password.length() && numberAll !=numberFigure) {
                return password;
            }
            System.out.println("密码不符合规范");
        }
    }

    // 判断用户身份证号码
    public static String guideUserIdOnComposition() {
        String IdOn;
        while (true) {
            System.out.println("请输入身份证：");
            Scanner scIdOn = new Scanner(System.in);
            IdOn = scIdOn.next();
            // 判断前17为数字
            int numberAll = 0;
            for (int i = 0; i < IdOn.length() - 1; i++) {
                if ('0' <= IdOn.charAt(i) && IdOn.charAt(i)<= '9') {
                    numberAll++;
                }
            }
            // 判断最后一位
            int numberLast = 0;
            if (('0' <= IdOn.charAt(IdOn.length() - 1) && IdOn.charAt(IdOn.length() - 1) <= '9') || IdOn.charAt(IdOn.length() - 1) == 'x' || IdOn.charAt(IdOn.length() - 1) == 'X') {
                numberLast++;
            }
            // 判断第一位、总长度、前17位和最后一位
            if (IdOn.charAt(0) != '0' && IdOn.length() == 18 && numberAll == 17 && numberLast == 1) {
                return IdOn;
            }
            System.out.println("身份证输入格式错误");
        }

    }

    // 判断用户手机号码
    public static String guidePhoneNumberComposition() {
        String phoneNumber;
        while (true) {
            System.out.println("请输入手机号：");
            Scanner scPhoneNumber = new Scanner(System.in);
            phoneNumber = scPhoneNumber.next();
            int number = 0;
            for (int i = 0; i < phoneNumber.length(); i++) {
                if ('0' <= phoneNumber.charAt(i) && phoneNumber.charAt(i) <= '9') {
                    number++;
                }
            }
            if (number == 11) {
                return phoneNumber;
            }
            System.out.println("手机号码输入错误");
        }
    }

    // 操作界面
    public static void operatioonInterface(ArrayList<Student> studentList) {
        boolean flog = true;
        while (flog) {
            System.out.println("---------学生信息管理系统操作界面----------");

            // 界面功能
            System.out.println("添加学生信息----------1");
            System.out.println("删除学生信息----------2");
            System.out.println("修改学生信息----------3");
            System.out.println("查询学生信息----------4");
            System.out.println("退出操作界面----------5");

            // 获取用户输入
            System.out.println("请输入需要的功能后的数字：");
            Scanner sc = new Scanner(System.in);
            String choice = sc.next();

            // 功能入口
            switch (choice) {
                case "1" -> add();
                case "2" -> delete();
                case "3" -> revise();
                case "4" -> inquire();
                case "5" -> flog = false;
                default -> System.out.println("没有此功能!");
            }
        }

    }

    // 添加学生
    public static void add() {
        Student student = new Student();
        System.out.println("请输入学生姓名：");
        Scanner scName = new Scanner(System.in);
        String name = scName.next();

        System.out.println("请输入学生年龄：");
        Scanner scAge = new Scanner(System.in);
        String age = scAge.next();

        System.out.println("请输入学生学号：");
        Scanner scId = new Scanner(System.in);
        String id = scId.next();

        System.out.println("请输入学生性别：");
        Scanner scGender = new Scanner(System.in);
        String  gender =  scGender.next();

        // 输入数据
        student.setId(id);
        student.setAge(age);
        student.setGender(gender);
        student.setName(name);
    }

    // 删除学生
    public static void delete() {
        System.out.println("功能未完善");
    }
    // 修改学生
    public static void revise() {
        System.out.println("功能未完善");
    }
    // 查询学生
    public static void inquire() {
        System.out.println("功能未完善");
    }
}

